package com.rabbit01.controller;

import com.rabbit01.config.DelayedQueueConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.annotation.*;

import java.util.Date;


/**
 * 发送延迟消息
 *  生产者
 */
@Slf4j
@RestController
@RequestMapping("/rabbit/info/ttl")
public class RabbitMQController {

    @Autowired
    private RabbitTemplate template;

    @GetMapping(value = "sendMsg")
    public void sendMsg(String msg){
        log.info("当前时间:{},发送一条信息给两个ttl队列:{}",new Date().toString(),msg);

        template.convertAndSend("X","XA","消息来自ttl为10s的队列"+msg);
        template.convertAndSend("X","XB","消息来自ttl为40s的队列"+msg);

    }


    /**
     * 发送带过期时间的消息
     * @param msg
     * @param ttlTime
     * 死信队列存在的问题 发送两次  其中第一次20s 第二次3秒  结果为都过期以后  程序从死信队列中一起获取到 并且是20s的先拿出来
     *  消息进入死信队列也会进行排队，取的时候也是先拿先进去的
     *  为什么第二次3秒不会先进入死信队列 -> rabbitmq只会先扫描检测第一个消息是否过期 过期则扔进死信队列  所以第二个消息并不会优先得到执行
     */
    @GetMapping(value = "sendExpirationMsg")
    public void sendExpirationMsg(String msg,String ttlTime){
        log.info("当前时间:{},发送一条信息时长是:{}毫秒ttl队列信息给QC:{}",new Date().toString(),ttlTime,msg);

        template.convertAndSend("X","XC",msg,message->{
            //发送消息的时候 延迟时长
            message.getMessageProperties().setExpiration(ttlTime);
            return message;
        });

    }


    /**
     * 发送延迟消息 基于mq插件
     * @param msg
     * @param ttlTime
     * 死信队列存在的问题 发送两次  其中第一次20s 第二次3秒  结果为都过期以后  程序从死信队列中一起获取到 并且是20s的先拿出来
     *  消息进入死信队列也会进行排队，取的时候也是先拿先进去的
     *  为什么第二次3秒不会先进入死信队列 -> rabbitmq只会先扫描检测第一个消息是否过期 过期则扔进死信队列  所以第二个消息并不会优先得到执行
     */
    @GetMapping(value = "sendDelayMsg")
    public void sendDelayMsg(String msg,Integer ttlTime){
        log.info("当前时间:{},发送一条信息时长是:{} 毫秒信息给延迟队列delayed.queue:{}",new Date().toString(),ttlTime,msg);

        template.convertAndSend(DelayedQueueConfig.DELAYED_EXCHANGE_NAME,DelayedQueueConfig.DELAYED_ROUTINGKEY_NAME,msg, message->{
            //发送消息的时候 延迟时长
            message.getMessageProperties().setDelay(ttlTime);
            return message;
        });

    }
}
